Skip to content
  • 0 Votes
    16 Posts
    2k Views
    J

    @JonB
    sorry for that,

    insert into Dataset(AT) values(?): I know nothing about SQLite. Dataset(AT) is a (syntactically valid) table to insert into, is it?
    Yes, it is valid statement in sqlite.

    Also QSqlQuery::prepare() returns a bool for success/failure, which you should be checking.
    Returns true if the query is prepared successfully; otherwise returns false.

    Plus, you check QSqlDatabase::lastError() after QSqlQuery::exec() fails, but that says
    yes, I got error. like QSqlError("","","");

    I checked again there was a problem in database but it solved thanks alot.
    Now, I'm able to insert data into database from QXlsx file.

  • 0 Votes
    5 Posts
    3k Views
    mrdebugM

    Hi, I suggest you to create a class to manage exceptions, so if you have a situation like this

    if (!MyQuery.Exec("select ..")) GeneralException.raise();
    if (!MyQuery.Exec("select ..")) GeneralException.raise();
    if (!MyQuery.Exec("select ..")) GeneralException.raise();

    if a query fails you will jump in the exception function manager.

    If you want to have the list of the columns present in a sqlite database you should use the sqlite features, so
    "pragma table_info(Table01)"
    To have the list of the tables I think there is a similar way.

    Regards.

  • 0 Votes
    7 Posts
    2k Views
    JonBJ

    @Ankit.Jain said in Reducing delay when reading from database:

    Running the same query in SQLiteStudio, the query takes similar time (2 to 2.5 secs), but I keep getting a status of "[09:09:49] Query finished in 0.006 second(s).". Because of this, I am not sure how this is calculated though.

    If it takes similar time in SQLiteStudio, it's not surprising it takes similar from Qt.

    I do not have rights for asking changes in the database. But just out of curiosity, how do you add an index to a column?

    I have never used SQLite. But CREATE INDEX in SQL creates an index. No idea whether SQLite will or will not take advantage of such an index if it exists, though...

  • 0 Votes
    3 Posts
    3k Views
    the_T

    @Qjay

    As far as I remember, it is not possible to create indices within a create table statement in sqlite. So you have to split this into the create table and the create index statement as mentioned by @mrjj

  • 0 Votes
    5 Posts
    3k Views
    mrjjM

    @M4RZB4Ni
    Ok ?
    I normally used .DB but didn't now it did mean anything ??

  • 0 Votes
    4 Posts
    2k Views
    SGaistS

    Well, follow the documentation starting here. You'll find the relevant topics on how to connect to a database, run queries, use models etc.

  • 0 Votes
    5 Posts
    4k Views
    AlbertoA

    At the end it was a typo. I was trying to insert a value into a column called Localización by using:

    guardar_s.prepare("INSERT INTO Solicitudes_Trabajo (Localizacion)

    The problem is in the accent mark.

    So if anyone gets this error, watch out the typos.

    Thanks @clochydd !

  • 0 Votes
    3 Posts
    4k Views
    AlbertoA

    Al final guardando cada valor de las dos bases de datos en QStrings funcionaba:

    QString _Telefono = seleccionar2.value(8).toByteArray().constData(); QString _Tecnico_Asignado = seleccionar2.value(0).toByteArray().constData(); QString _Estado_Solicitud = seleccionar2.value(7).toByteArray().constData();

    Así podía usar este código sin problema:

    QSqlQuery guardar_s; guardar_s.prepare("INSERT INTO Solicitudes_Trabajo (N_Solicitud, Fecha_Emision, Unidad_Hospitalaria," "Codigo_Equipo, Equipo, Marca)" "VALUES (:N_Solicitud, :Fecha_Emision, :Unidad_Hospitalaria, :Codigo_Equipo, :Equipo," ":Marca)"); guardar_s.bindValue(":N_Solicitud", _N_Solicitud); guardar_s.bindValue(":Fecha_Emision", _Fecha_Emision); guardar_s.bindValue(":Unidad_Hospitalaria", _Unidad_Hospitalaria); guardar_s.bindValue(":Codigo_Equipo", _Codigo_Equipo); guardar_s.bindValue(":Equipo", _Equipo); guardar_s.bindValue(":Marca", _Marca);

    Insertaba los valores de las dos bases de datos en la base Empresa, pero si usaba este otro con más valores no funcionaba:

    QSqlQuery guardar_s; guardar_s.prepare("INSERT INTO Solicitudes_Trabajo (N_Solicitud, Fecha_Emision, Unidad_Hospitalaria, Codigo_Equipo," "Equipo, Marca, Modelo, N_Serie, Localizacion, Unidad_Tecnica, Peticionario, Telefono, " "Descripcion_Solicitud, Tecnico_Asignado, Tipo_Solicitud, Estado_Solicitud) " "VALUES (:N_Solicitud, :Fecha_Emision, :Unidad_Hospitalaria, :Codigo_Equipo, :Equipo, :Marca, :Modelo," ":N_Serie, :Localizacion, :Unidad_Tecnica, :Peticionario, :Telefono, :Descripcion_Solicitud," ":Tecnico_Asignado, :Tipo_Solicitud, :Estado_Solicitud)"); guardar_s.bindValue(":N_Solicitud", _N_Solicitud); guardar_s.bindValue(":Fecha_Emision", _Fecha_Emision); guardar_s.bindValue(":Unidad_Hospitalaria",_Unidad_Hospitalaria); guardar_s.bindValue(":Codigo_Equipo", _Codigo_Equipo); guardar_s.bindValue(":Equipo", _Equipo); guardar_s.bindValue(":Marca", _Marca); guardar_s.bindValue(":Modelo", _Modelo); guardar_s.bindValue(":N_Serie", _N_Serie); guardar_s.bindValue(":Localizacion", _Localizacion); guardar_s.bindValue(":Unidad_Tecnica", _Unidad_Tecnica); guardar_s.bindValue(":Peticionario", _Peticionario); guardar_s.bindValue(":Telefono", _Telefono); guardar_s.bindValue(":Descripcion_Solicitud", _Descripcion_Solicitud); guardar_s.bindValue(":Tecnico_Asignado", _Tecnico_Asignado); guardar_s.bindValue(":Tipo_Solicitud", "a"); guardar_s.bindValue(":Estado_Solicitud", _Estado_Solicitud);

    Me daba el error: 12.ERROR: QSqlError("", "Parameter count mismatch", "").

    Pensaba que quizás eran demasiados valores para Qt Creator. Pero al final, después de muchas pruebas me dí cuenta que estaba intentando insertar un valor en la columna existente Localización con un INSERT INTO Solicitudes_Trabajo (Localizacion).
    Lo explico por si a alguien más le sale ese mismo error que pruebe a revisar todos los campos y columnas en busca de algún pequeño fallo en alguna letra o alguna tilde.

  • 0 Votes
    1 Posts
    872 Views
    No one has replied
  • 0 Votes
    5 Posts
    3k Views
    AlbertoA

    Solved.
    I tried a lot of things to solve the problem. Some of them included calling next before accessing the result as @SGaist said, but it continued saying:

    QSqlQuery::value: not positioned on a valid record

    At last I created a new project with a new database and it worked properly with this code:

    hospital=QSqlDatabase::addDatabase("QSQLITE"); hospital.setDatabaseName("C:/Sqlite3/Hospital.sqlite"); if(hospital.open()){ qDebug()<<"4.Se ha conectado a la base de datos Hospital"; }else{ qDebug()<<"4.ERROR. No se ha conectado a la base de datos Hospital"; } QSqlQuery mostrar; mostrar.prepare("SELECT*FROM Partes WHERE N_Parte=:ID"); mostrar.bindValue(":ID",ui->lineEditN_Parte->text()); if(mostrar.exec()) { qDebug()<<"5.Los datos del parte se han mostrado correctamente"; }else{ qDebug()<<"5.ERROR. Los datos del parte no se han mostrado correctamente"; qDebug()<<"5.ERROR:"<<mostrar.lastError(); } mostrar.next(); ui->tableWidget->setRowCount(15); QStringList Campos; Campos<<"Fecha de Emisión"<<"Unidad Hospitalaria"; ui->tableWidget->setVerticalHeaderLabels(Campos); ui->tableWidget->insertColumn(0); ui->tableWidget->setColumnCount(1); ui->tableWidget->setItem(0, 0, new QTableWidgetItem(mostrar.value(1).toByteArray().constData())); ui->tableWidget->setItem(2, 0, new QTableWidgetItem(mostrar.value(2).toByteArray().constData()));

    So I guess the problem was in the database, maybe in the columns, maybe in the rows, maybe in the values or maybe in the name of each of them.

    The important thing is that the code I post in this reply works perfectly, so if anyone has a similar problem I hope it helps.

    Thank you very much!

  • 0 Votes
    4 Posts
    5k Views
    AlbertoA

    Resuelto.
    Intenté muchas cosas para solucionar el problem, algunas incluian la utilización de next() que me faltaba en el código de mi respuesta anterior pero continuaba saliendo el error:

    QSqlQuery::value: not positioned on a valid record

    Al final creé un nuevo proyecto con una base de atos nuevas y funciona correctamente con este código:

    hospital=QSqlDatabase::addDatabase("QSQLITE"); hospital.setDatabaseName("C:/Sqlite3/Hospital.sqlite"); if(hospital.open()){ qDebug()<<"4.Se ha conectado a la base de datos Hospital"; }else{ qDebug()<<"4.ERROR. No se ha conectado a la base de datos Hospital"; } QSqlQuery mostrar; mostrar.prepare("SELECT*FROM Partes WHERE N_Parte=:ID"); mostrar.bindValue(":ID",ui->lineEditN_Parte->text()); if(mostrar.exec()) { qDebug()<<"5.Los datos del parte se han mostrado correctamente"; }else{ qDebug()<<"5.ERROR. Los datos del parte no se han mostrado correctamente"; qDebug()<<"5.ERROR:"<<mostrar.lastError(); } mostrar.next(); ui->tableWidget->setRowCount(15); QStringList Campos; Campos<<"Fecha de Emisión"<<"Unidad Hospitalaria"; ui->tableWidget->setVerticalHeaderLabels(Campos); ui->tableWidget->insertColumn(0); ui->tableWidget->setColumnCount(1); ui->tableWidget->setItem(0, 0, new QTableWidgetItem(mostrar.value(1).toByteArray().constData())); ui->tableWidget->setItem(2, 0, new QTableWidgetItem(mostrar.value(2).toByteArray().constData()));

    Así que supongo que el problema estaba en la base de datos anterior, quizás en las columnas, quizás en las filas, quizás en los valores o quizás en el nombre de cada uno de estos elementos.
    Lo importante es que el código que adjunto en esta respuesta funciona correctamente, de modo que si alguien tiene un problema parecido espero que esto le ayude.

    Muchas gracias!

  • 0 Votes
    1 Posts
    962 Views
    No one has replied
  • 1 Votes
    4 Posts
    6k Views
    HoMaH

    just for completness: since 2019 sqlite supports the "VACCUUM INTO" command - which solves the problem with just one piece of SQL